<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Promise</title>
</head>
<body>
<script>
    //ES6新增异步解决方案
    //Promise  generator   ===> ES7 async/await


    //Promise(承诺) 表示未来的某个时间一定会返回一个结果
    //Promise 是一个容器,里面包裹了一些异步操作,它表示一个预计会在未来完成的异步操作
    //PromiseState(promise状态) pending(进行中) fulfilled(已成功) rejected(已失败)
    //Promise状态变化pending =>fulfilled 或者 pending=>rejected 不可逆的,而且一旦执行成功状态就会凝固 不会在发生其他变化了
    //Promise实例上 有三个api
    // then(resolve=>{},reject=>{}) 方法中有两个回调函数 分别表示成功后的回调 和失败后的回调
    // catch(err=>{}) 在创建或者使用promise的时候,如果代码报错那么会自动的走then.reject 如果在then中没有reject回调,会在catch中进行错误捕获, catch方法也会捕获在then方法中发生任何错误
    // finally(()=>{})  无论promise执行成功或者失败,也无论catch方法是否执行, 最终finally都会执行

   /* {//一旦promise创建成功就会立即执行(new Promise(同步的))
        console.log(1)
        let p1 = new Promise((resolve, reject)=>{

            resolve("1")//成功后的回调
            reject("2")//失败后的回调
            console.log(2)
        })

        console.log(p1);
        p1.then((resolve)=>{//异步操作
            // resolve 成功后的结果

            console.log(3)

            console.log("resolve 成功后的结果",resolve);

        },(reject)=>{
            // reject 失败后的结果
            console.log("reject 失败后的结果",reject);
        }))

        console.log(4)
        //1243


    }*/

/*    //抛出
    throw new Error("手动报错")*/

  /*  {//promise错误捕获 catch
        //在创建或者使用promise的时候,如果代码报错那么会自动的走then.reject 如果在then中没有reject回调,会在catch中进行错误捕获, catch方法也会捕获在then方法中发生任何错误
        let p1 = new Promise((resolve, reject) => {
            if (1 > 0) {
                resolve(1)
            } else {
                reject(2)
            }
        })

        p1.then((resolve) => {
            throw new Error("手动报错")
            console.log("resolve 成功后的结果", resolve);
        }, (reject) => {
            console.log("reject 失败后的结果", reject);
        }).catch((err)=>{

            console.log("catch err===>", err);
        })
        // console.log(p1);
    }*/

    {//promise.finally=>无论promise执行成功或者失败,也无论catch方法是否执行, 最终finally都会执行
        let p1 = new Promise((resolve, reject) => {
            if (1 > 0) {
                throw new Error("手动报错")
                resolve(1)
            } else {
                reject(2)
            }
        })

        p1.then((resolve) => {
            console.log("resolve 成功后的结果", resolve);
        }, (reject) => {
            throw new Error("手动报错")
            console.log("reject 失败后的结果", reject);
        }).catch((err)=>{
            console.log("catch err===>", err);
        }).finally(()=>{
            console.log("finally fin===>");
        })
        // console.log(p1);
    }


    //接口返回的数据  正常情况下 [1,2,3,4]
    //接口返回的数据  不正常情况下 {}.forEach
    let res = [1,2,3,4]
    res = {}
    try{
        res.forEach(i=>i)
    }catch (e) {
        res=[]
    }











</script>
</body>
</html>